// 发布订阅
export default class Event {
  constructor() {
    // 储存事件的数据结构
    // 为查找迅速， 使用对象（字典）
    this._cache = {};
  }

  /**
   * 绑定
   * @param {*} type 
   * @param {*} callback 
   */
  on(type, callback) {
    let fns = (this._cache[type] = this._cache[type] || []);
    if (fns.indexOf(callback) === -1) {
      fns.push(callback);
    }
    return this;
  }

  /**
   * 触发
   * @param {*} type 
   * @param {*} data 
   */
  trigger(type, data) {
    let fns = this._cache[type];
    if (Array.isArray(fns)) {
      fns.forEach((fn) => {
        fn(data);
      });
    }
    return this;
  }

  /**
   * 解绑
   * @param {*} type 
   * @param {*} callback 
   */
  off(type, callback) {
    let fns = this._cache[type];
    if (Array.isArray(fns)) {
      if (callback) {
        let index = fns.indexOf(callback);
        if (index !== -1) {
          fns.splice(index, 1);
        }
      } else {
        // 全部清空
        fns.length = 0;
      }
    }
    return this;
  }
}
